/**
 * 动画参数类型定义
 * 
 * 定义所有动画预设的参数类型，提供完整的类型安全
 */

// ==================== 基础动画参数 ====================

/**
 * 挥手动画参数
 */
export interface WaveAnimationParams {
    /** 挥手角度（弧度），默认0.3 */
    angle?: number;
    /** 动画时长（毫秒），默认500 */
    duration?: number;
    /** 挥手方向，默认'right' */
    direction?: 'left' | 'right';
}

/**
 * 跳跃动画参数
 */
export interface JumpAnimationParams {
    /** 跳跃高度，默认50 */
    height?: number;
    /** 动画时长（毫秒），默认400 */
    duration?: number;
    /** 弹跳次数，默认1 */
    bounces?: number;
}

/**
 * 旋转动画参数
 */
export interface SpinAnimationParams {
    /** 旋转圈数，默认1 */
    rotations?: number;
    /** 动画时长（毫秒），默认1000 */
    duration?: number;
    /** 旋转方向，默认'clockwise' */
    direction?: 'clockwise' | 'counterclockwise';
}

/**
 * 弹跳动画参数
 */
export interface BounceAnimationParams {
    /** 弹跳高度，默认30 */
    height?: number;
    /** 动画时长（毫秒），默认300 */
    duration?: number;
    /** 弹跳次数，默认1 */
    bounces?: number;
}

/**
 * 摇晃动画参数
 */
export interface ShakeAnimationParams {
    /** 摇晃幅度，默认10 */
    amount?: number;
    /** 动画时长（毫秒），默认300 */
    duration?: number;
    /** 摇晃频率，默认8 */
    frequency?: number;
    /** 摇晃轴，默认'x' */
    axis?: 'x' | 'y' | 'both';
}

/**
 * 缩放动画参数
 */
export interface ScaleAnimationParams {
    /** 目标缩放比例，默认1.2 */
    scale?: number;
    /** 动画时长（毫秒），默认300 */
    duration?: number;
    /** 缩放类型，默认'pulse' */
    type?: 'pulse' | 'bounce';
}

/**
 * 移动动画参数
 */
export interface MoveAnimationParams {
    /** X轴移动距离，默认0 */
    x?: number;
    /** Y轴移动距离，默认0 */
    y?: number;
    /** 动画时长（毫秒），默认500 */
    duration?: number;
    /** 是否返回起点，默认false */
    returnToStart?: boolean;
}

// ==================== 统一动画参数类型 ====================

/**
 * 所有动画参数的联合类型
 */
export type AnimationParams = 
    | WaveAnimationParams 
    | JumpAnimationParams 
    | SpinAnimationParams 
    | BounceAnimationParams 
    | ShakeAnimationParams 
    | ScaleAnimationParams 
    | MoveAnimationParams;

/**
 * 动画类型枚举
 */
export type AnimationType = 
    | 'wave' 
    | 'jump' 
    | 'spin' 
    | 'bounce' 
    | 'shake' 
    | 'scale' 
    | 'move';

/**
 * 动画参数映射类型
 */
export interface AnimationParamsMap {
    wave: WaveAnimationParams;
    jump: JumpAnimationParams;
    spin: SpinAnimationParams;
    bounce: BounceAnimationParams;
    shake: ShakeAnimationParams;
    scale: ScaleAnimationParams;
    move: MoveAnimationParams;
}

// ==================== 动画配置项类型 ====================

/**
 * 单个动画配置项
 */
export interface AnimationConfigItem {
    /** 动画标签 */
    label: string;
    /** 动画参数 */
    params: AnimationParams;
    /** 按钮颜色 */
    color: string;
}

/**
 * 动画配置组
 */
export interface AnimationConfigGroup {
    [key: string]: AnimationConfigItem[];
}

// ==================== 默认参数常量 ====================

/**
 * 默认动画参数
 */
export const DEFAULT_ANIMATION_PARAMS = {
    wave: {
        angle: 0.3,
        duration: 500,
        direction: 'right' as const
    },
    jump: {
        height: 50,
        duration: 400,
        bounces: 1
    },
    spin: {
        rotations: 1,
        duration: 1000,
        direction: 'clockwise' as const
    },
    bounce: {
        height: 30,
        duration: 300,
        bounces: 1
    },
    shake: {
        amount: 10,
        duration: 300,
        frequency: 8,
        axis: 'x' as const
    },
    scale: {
        scale: 1.2,
        duration: 300,
        type: 'pulse' as const
    },
    move: {
        x: 0,
        y: 0,
        duration: 500,
        returnToStart: false
    }
} as const;

// ==================== 类型工具函数 ====================

/**
 * 获取指定动画类型的参数类型
 */
export type GetAnimationParams<T extends AnimationType> = AnimationParamsMap[T];

/**
 * 获取指定动画类型的默认参数
 */
export type GetDefaultParams<T extends AnimationType> = typeof DEFAULT_ANIMATION_PARAMS[T];

/**
 * 合并默认参数和用户参数
 */
export type MergedAnimationParams<T extends AnimationType> = 
    GetDefaultParams<T> & Partial<GetAnimationParams<T>>;

// ==================== 验证函数类型 ====================

/**
 * 动画参数验证函数类型
 */
export type AnimationParamsValidator<T extends AnimationType> = 
    (params: GetAnimationParams<T>) => boolean;

/**
 * 动画参数验证结果
 */
export interface ValidationResult {
    /** 是否有效 */
    isValid: boolean;
    /** 错误信息 */
    errors?: string[];
}

// ==================== 导出所有类型 ====================

// 所有类型已在上面通过 export interface/type 导出
// 这里不需要重复导出 